package br.com.logistica.database;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.log4j.Logger;

import br.com.logistica.base.BaseDAO;
import br.com.logistica.base.BaseException;
import br.com.logistica.databaseinterface.IGenericDAO;
import br.com.logistica.util.dto.ServiceDTO;
import br.com.logistica.vo.Conhecimento;
import br.com.util.BeanUtil;
import br.com.util.QueryUtil;

public class ConhecimentoDAO extends BaseDAO implements IGenericDAO{
	private static Logger logg=Logger.getLogger(ConhecimentoDAO.class);
	
	@Override
	public ServiceDTO retrieve() throws BaseException {
		ServiceDTO result = new ServiceDTO();
		try {
			entityManager = FactoryJPA.getInstance(baseEnum);
		} catch (Exception err) {
			logg.error(err.getMessage());
		}
		
		try {

			List<br.com.logistica.persistence.entidades.Conhecimento> conh = entityManager.createQuery("from conhecimento").getResultList();

			ArrayList<Conhecimento> conhVO = new ArrayList<Conhecimento>();

			for (br.com.logistica.persistence.entidades.Conhecimento conhe : conh) {

				conhVO.add(BeanUtil.castConhecimentoPersistenceParaVO(conhe));
			}

			result.set("conhecimento", conhVO);
		} catch (Exception e) {
			logg.error(e);
		}
		return result;
	}

	@Override
	public ServiceDTO retrieve(ServiceDTO req) throws BaseException {
		try {
			entityManager = FactoryJPA.getInstance(baseEnum);
		} catch (Exception err) {
			logg.error(err.getMessage());
		}

		ServiceDTO result = new ServiceDTO();
		Conhecimento conh = (Conhecimento) req.get("conhecimento");

		try {
			br.com.logistica.persistence.entidades.Conhecimento conhP = BeanUtil.castConhecimentoVOConhecimentoPersistance(conh);
			conhP = entityManager.find(br.com.logistica.persistence.entidades.Conhecimento.class,conhP.getIdConhecimento());
			result.set("conhecimento", BeanUtil.castConhecimentoPersistenceParaVO(conhP));

		} catch (Exception e) {
			logg.error(e);
		}

		return result;
	}

	@Override
	public ServiceDTO restrictedRetrieve(ServiceDTO serviceDTO) throws BaseException {
		ServiceDTO result = new ServiceDTO();

		HashMap<String, Object> mapa = (HashMap<String, Object>) serviceDTO.get("pesquisaRestritiva");

		result.set("pesquisaRestritiva",QueryUtil.fazerConsultaDinamica(mapa, Conhecimento.class));
		return result;
	}

	@Override
	public ServiceDTO create(ServiceDTO serviceDTO) throws BaseException {
		ServiceDTO result = new ServiceDTO();
		this.begin();
		try {

			Conhecimento conhVO = (Conhecimento) serviceDTO.get("conhecimento");
			entityManager.persist(entityManager.merge(BeanUtil.castConhecimentoVOConhecimentoPersistance(conhVO)));
			this.commit();

		} catch (Exception e) {
			logg.error(e);
			this.rollback();
		}

		return result;
	}

	@Override
	public ServiceDTO update(ServiceDTO serviceDTO) throws BaseException {
		ServiceDTO result = new ServiceDTO();

		this.begin();

		try {
			Conhecimento conhVO = (Conhecimento) serviceDTO.get("conhecimento");

			entityManager.merge(BeanUtil.castConhecimentoVOConhecimentoPersistance(conhVO));
			this.commit();
		} catch (Exception e) {
			logg.error(e);

			this.rollback();
		}

		return result;
	}

	@Override
	public ServiceDTO delete(ServiceDTO serviceDTO) throws BaseException {
		ServiceDTO result = new ServiceDTO();

		this.begin();

		try {

			Conhecimento conhVO = (Conhecimento) serviceDTO.get("conhecimento");
			entityManager.remove(entityManager.merge(BeanUtil.castConhecimentoVOConhecimentoPersistance(conhVO)));
			this.commit();

		} catch (Exception e) {
			logg.error(e);
			this.rollback();
		}

		return result;
	}
	

}
